package com.android.support.lib.universal.util;

import com.android.support.lib.universal.R;
import com.android.support.lib.universal.listenner.ListennerLv;

import android.app.Activity;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.PopupWindow;

/**
 * 使用说明
 * UtilPopuWindow.showPop(context, activity, layoutId, drawableId, animId, ViewId, listenner);//打开
 * UtilPopuWindow.cancel();//关闭
 * 
 * @author 彭治铭
 *
 */
public class UtilpopuWindow {
	public  PopupWindow pw;
	/**
	 * 
	 * @param activity
	 *            Activity上下文
	 * @param layoutId
	 *            自定义popuwind的布局文件
	 * @param drawableId
	 *            popu的背景样式,如R.drawable.lib_popu_bg ，无可为 0(会添加默认文件)
	 * @param animId
	 *            动画文件,改动画文件必须放在Style里，如：R.style.PopupAnimation ,无可为 0(会添加默认文件)
	 * @param ViewId
	 *            当前Activity布局里的View控件，用来显示popuwindow
	 * @param listenner 回调函数，给指定布局添加对应事件。 可为 null
	 */
	public  void showPop(Activity activity,
			int layoutId, int drawableId, int animId, int ViewId,
			ListennerLv listenner) {
		// TODO Auto-generated method stub
		if (pw != null) {
			pw.dismiss();// 只是关闭，不等价于pw=null
			pw = null;// 这句必不可少
		}
		View view_menu;// popuwindow中的view
		view_menu = activity.getLayoutInflater().inflate(layoutId, null);
		if (pw == null) {
			// 用Popupwindow弹出menu
			/**
			 * popuwindow中的view的宽和高
			 */
			pw = new PopupWindow(view_menu, LayoutParams.WRAP_CONTENT,
					LayoutParams.WRAP_CONTENT);
			// pw.setBackgroundDrawable(getResources().getDrawable(
			// R.drawable.abc_ab_bottom_solid_light_holo)); //设置背景,这样触摸返回键 和
			// popuwindow触摸外区，会让popuwindow会被自动关闭
			/**
			 * 背景样式
			 */
			if(drawableId!=0){
				pw.setBackgroundDrawable(activity.getResources().getDrawable(
						drawableId));
				pw.getBackground().setAlpha(235); // 设置透明度,0~255,0完全透明，255完全不透明
			}else{
				pw.setBackgroundDrawable(activity.getResources().getDrawable(
						R.drawable.lib_popu_bg));
				pw.getBackground().setAlpha(235); // 设置透明度,0~255,0完全透明，255完全不透明
			}
			/**
			 * 按menu出来PopupWindow，再按menu就消失,因为PopupWindow出现后，会屏蔽menu键，再按menu就无效了
			 * 。所以 通过PopupWindow加装的view再来获取焦点。再捕捉menu键,必须是popuwindow里面的view获取焦点
			 */
			view_menu.setFocusableInTouchMode(true);// 能够获得焦点
			view_menu.setOnKeyListener(new OnKeyListener() {

				@Override
				public boolean onKey(View v, int keyCode, KeyEvent event) {
					// TODO Auto-generated method stub
					if (event.getAction() == KeyEvent.ACTION_DOWN) {
						switch (keyCode) {
						case KeyEvent.KEYCODE_BACK:

							break;
						case KeyEvent.KEYCODE_MENU:
							pw.dismiss();// 只是关闭，不等价于pw=null
							pw = null;// 这句必不可少
							break;
						}
					}
					return true;
				}
			});

			/**
			 * 以下自定义，通过view_menu，获取相应控，并添加相应事件 以下为取消事件
			 */
			// ImageView cancel = (ImageView)
			// view_menu.findViewById(R.id.cancanl_btns);
			// cancel.setOnClickListener(new OnClickListener() {
			// @Override
			// public void onClick(View v) {
			// // TODO Auto-generated method stub
			// cancel();
			// }
			// });
			if(listenner!=null){
				listenner.OnResult(view_menu);// 通过回调函数，添加对应事件
			}

			/**
			 * 位置显示
			 */
			DisplayMetrics dm = new DisplayMetrics();
			activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
			int screenWidth = dm.widthPixels;
			int screenHeight = dm.heightPixels;
			/**
			 * 动画要在style文件里
			 */
			if(animId!=0){
				pw.setAnimationStyle(animId);// 看清是 R.style. 在show之前
			}else{
				pw.setAnimationStyle(R.style.PopupAnimation);// 看清是 R.style. 在show之前
			}
			/**
			 * 如果为false点击相关的空间表面上没有反应，事件不可以监听到的。
			 * true:popuwindow弹出后，menu键，返回键无法被监听其他事件，但触摸返回键 和
			 * popuwindow触摸外区，会让popuwindow会被自动关闭。 只是关闭dismiss(不可见),不等于null
			 */
			pw.setFocusable(true);// 点击相关的空间表面有反应，事件是可以监听到的。
			pw.update();// 刷新数据
			// 设置PopupWindow外部区域是否可触摸
			pw.setOutsideTouchable(true);
			pw.setWidth(screenWidth);
			// NND, 第一个参数， 必须在当前布局找个View控件
			pw.showAtLocation(activity.findViewById(ViewId), Gravity.CENTER, 0,
					screenHeight);

		} else {
			pw.dismiss();// 只是关闭，不等价于pw=null

			pw = null;// 这句必不可少
		}
	}

	/**
	 * 取消事件
	 */
	public  void cancel() {
		if (pw != null) {
			pw.dismiss();// 只是关闭，不等价于pw=null
			pw = null;// 这句必不可少
		}
	}
}
